"Подтверждение трех путей" - это процедура, используемая при установлении соединения. Эта процедура обычно инициируется программой протокола TCP в ответ на запрос другой программы TCP. Данная процедура также работает, если две программы TCP инициируют ее одновременно. Когда попытка инициализации осуществляется с обоих концов одновременно, каждая программа протокола TCP получает сегмент "SYN", который не несет подтверждения для уже отправленного ею "SYN". Конечно, прибытие старых дубликатов сегмента "SYN" может произвести впечатление на получателя, будто осуществляется одновременное открытие соединения. Корректное применение сегментов "перезагрузки" может предотвратить двусмысленность таких ситуаций.
Ниже приведены несколько примеров инициализации соединений. Хотя эти примеры не показывают синхронизации соединения с помощью сегментов, несущих данные, это совершенно правомерно, поскольку программа TCP, получающая сегменты, не передаст данные своему клиенту, пока не станет очевидным корректность данных (т.е. данные должны "складироваться" пользователем до тех пор, пока соединение не перейдет в состояние ESTABLISHED). Подтверждение трех путей уменьшает вероятность появления ложных соединений. Получение информации для такой проверки достигается посредством реализации обмена между памятью компьютера и циркулирующими в сети сообщениями.
Простейшая процедура подтверждения трех путей показана ниже на рисунке. Рисунки следует интерпретировать следующим образом. Для удобства каждая строка пронумерована. Правые стрелки (-->) показывают отправление TCP сегмента от программы TCP A в программу TCB B, или же получение сегмента программой B из программы A. Левые стрелки (<--) показывают обратные процессы. Многоточие (...) показывает сегмент, который все еще задерживается в сети. "XXX" указывает на сегмент, который потерян или отвергнут. Комментарии появляются в скобках. Здесь "состояния" программы протокола TCP соответствуют моменту сразу после посылки или получения сегмента (содержимое этого сегмента показано в средней колонке каждой строки). Содержимое сегмента в приводится в сокращенной форме и представляет собой номер очереди, флаги управления и поле ACK. Остальные поля сегмента, такие как окно, длина и поле данных остаются за рамками нашего интереса.
Основная процедура подтверждения трех путей для синхронизации соединения.
На строке 2 рисунка 7 программа TCP A начинает с посылки сигнала SYN, показывая тем самым, что она будет использовать номера очереди, начиная с номера 100. На строке 3 программа TCB B посылает сигнал SYNM, а также подтверждение о том, что сигнал SYN со стороны программы TCP A получен. Заметим, что поле подтверждения информирует о том, что программа TCP B в данный момент ожидает получение номера 101. Последнее также подтверждает, что сигнал SYN уже занял место в очереди под номером 100.
На строке 4 для отправленного программой TCP B в строке 3 сигнала SYN программа TCP A дает ответ с помощью пустого сегмента, содержащего сигнал ACK . В строке 5 программа TCP A передает по сети уже некую порцию данных. Заметим, что сегмент в строке 5 имеет тот же номер очереди, что был у сегмента в строке 4, поскольку сигнал ACK в очереди места не занимает (если бы это было не так, то нам следовало обзавестись подтверждением -ACK- для самого подтверждения!).
На рисунке ниже показана та же инициализация с незначительными усложнениями. Каждая программа TCP проходит по очереди состояния CLOSED, SYN-SENT, SYN-RECEIVED и наконец, ESTABLISHED. Одновременная синхронизация соединения.
Главной причиной для применения подтверждения трех путей является попытка предотвратить возникновение сбоев при получении старых дубликатов, инициирующих соединение. Для работы с подтверждением трех путей придумано специальное контрольное сообщение - перезагрузка (reset). Если получающая сигнал программа TCP находится не в синхронизированном состоянии (т.е. в SYN-SENT, SYN-RECEIVED), то она возвращает сигнал LISTEN, показывая, что она получила приемлемый сигнал перезагрузки. Если же программа TCP находится в одном из синхронизированных состояний (ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT), то она ликвидирует соединение и проинформирует об этом своего клиента. Мы обсудим ниже такую ситуацию при рассмотрении "наполовину открытых" соединений. Получение старого дубликата сигнала SYN.
В качестве простого примера рассмотрим ситуацию с получением старых дубликатов на рисунке . На строке 3 старый дубликат сигнала SYN достигает программу TCP B. Последняя не может определить, что это старый дубликат, и поэтому отвечает обычным образом (строка 4). Программа TCP A обнаруживает ошибочное значение в поле ACK и поэтому возвращает сигнал RST (перезагрузка). При этом значение поля SEQ выбирается таким образом, чтобы сделать сегмент правдоподобным. Программа TCP B по получении сигнала RST переходит в состояние LISTEN. Когда на строке 6 сигнал SYN, действительный, а не устаревший, достигает программу TCP B, процесс синхронизации происходит нормально. Если же сигнал SYN на строке 6 достигает программу TCP B прежде сигнала RST, может возникнуть более сложная комбинация обмена с посылкой RST в обоих направлениях.